package org.deng.learn.mybatis;

/**
 * @Author DengLibin
 * @Date 19-4-28
 * @Time 上午10:06
 * @Desc
 */
public class Info {
    /**
     * mybatis学习： 文档地址 http://www.mybatis.org/mybatis-3/zh/
     * SqlSessionFactoryBuilder：
     *      这个类可以被实例化、使用和丢弃，一旦创建了 SqlSessionFactory，就不再需要它了。 因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域（也就是局部方法变量）。
     *      你可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例，但是最好还是不要让其一直存在，以保证所有的 XML 解析资源可以被释放给更重要的事情。
     *
     *SqlSessionFactory
     *      SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在，没有任何理由丢弃它或重新创建另一个实例。
     *      使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次，
     *      多次重建 SqlSessionFactory 被视为一种代码“坏味道（bad smell）”。因此 SqlSessionFactory 的最佳作用域是应用作用域。
     *      有很多方法可以做到，最简单的就是使用单例模式或者静态单例模式。
     *SqlSession
     *      每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的，因此是不能被共享的，所以它的最佳的作用域是请求或方法作用域。
     *      绝对不能将 SqlSession 实例的引用放在一个类的静态域，甚至一个类的实例变量也不行。
     *      也绝不能将 SqlSession 实例的引用放在任何类型的托管作用域中，比如 Servlet 框架中的 HttpSession。
     *      如果你现在正在使用一种 Web 框架，要考虑 SqlSession 放在一个和 HTTP 请求对象相似的作用域中。
     *      换句话说，每次收到的 HTTP 请求，就可以打开一个 SqlSession，返回一个响应，就关闭它。 这个关闭操作是很重要的，你
     *      应该把这个关闭操作放到 finally 块中以确保每次都能执行关闭。 下面的示例就是一个确保 SqlSession 关闭的标准模式：
     *      SqlSession session = sqlSessionFactory.openSession();
     * try {
     *   // 你的应用逻辑代码
     * } finally {
     *   session.close();
     * }
     *
     *映射器实例 Mapper实例
     *      映射器是一些由你创建的、绑定你映射的语句的接口。映射器接口的实例是从 SqlSession 中获得的。因此从技术层面讲，
     *      任何映射器实例的最大作用域是和请求它们的 SqlSession 相同的。尽管如此，映射器实例的最佳作用域是方法作用域。
     *      也就是说，映射器实例应该在调用它们的方法中被请求，用过之后即可丢弃。 并不需要显式地关闭映射器实例，
     *      尽管在整个请求作用域保持映射器实例也不会有什么问题，但是你很快会发现，像 SqlSession 一样，在这个作用域上管理太多的资源的话会难于控制。
     *      为了避免这种复杂性，最好把映射器放在方法作用域内。下面的示例就展示了这个实践：
     *  SqlSession session = sqlSessionFactory.openSession();
     * try {
     *   BlogMapper mapper = session.getMapper(BlogMapper.class);
     *   // 你的应用逻辑代码
     * } finally {
     *   session.close();
     * }
     *
     *
     * 插件（plugins）
     * MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。默认情况下，MyBatis 允许使用插件来拦截的方法调用包括：
     *
     * Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
     * ParameterHandler (getParameterObject, setParameters)
     * ResultSetHandler (handleResultSets, handleOutputParameters)
     * StatementHandler (prepare, parameterize, batch, update, query)
     *
     * 事务管理器（transactionManager）
     *      在 MyBatis 中有两种类型的事务管理器（也就是 type=”[JDBC|MANAGED]”）：JdbcTransactionFactory / ManagedTransactionFactory
     *      JDBC – 这个配置就是直接使用了 JDBC 的提交和回滚设置，它依赖于从数据源得到的连接来管理事务作用域。
     *      MANAGED – 这个配置几乎没做什么。它从来不提交或回滚一个连接，而是让容器来管理事务的整个生命周期（比如 JEE 应用服务器的上下文）。 默认情况下它会关闭连接，然而一些容器并不希望这样，因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为。例如:
     * <transactionManager type="MANAGED">
     *   <property name="closeConnection" value="false"/>
     * </transactionManager>
     * 提示：如果你正在使用 Spring + MyBatis，则没有必要配置事务管理器， 因为 Spring 模块会使用自带的管理器来覆盖前面的配置。
     *
     *
     * 数据源（dataSource）
     *      dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。
     *      许多 MyBatis 的应用程序会按示例中的例子来配置数据源。虽然这是可选的，但为了使用延迟加载，数据源是必须配置的。
     *      有三种内建的数据源类型（也就是 type=”[UNPOOLED|POOLED|JNDI]”）：
     *
     */
}
